package com.codedef.util;

import com.codedef.common.exception.CustomException;
import com.codedef.common.response.ResultCode;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.xml.bind.DatatypeConverter;


@Slf4j
public class JwtUtil {

    private static final String AUTHORIZATION_HEADER_PREFIX = "Bearer ";

    // 构造私有
    private JwtUtil() {
    }

    /**
     * 获取原始token信息
     *
     * @param authorizationHeader 授权头部信息
     * @return
     */
    public static String getRawToken(String authorizationHeader) {
        return authorizationHeader.substring(AUTHORIZATION_HEADER_PREFIX.length());
    }

    /**
     * 获取授权头部信息
     *
     * @param rawToken token信息
     * @return
     */
    public static String getAuthorizationHeader(String rawToken) {
        return AUTHORIZATION_HEADER_PREFIX + rawToken;
    }

    /**
     * 校验授权头部信息格式合法性
     *
     * @param authorizationHeader 授权头部信息
     * @return
     */
    public static boolean validate(String authorizationHeader) {
        return StringUtils.hasText(authorizationHeader)
                && authorizationHeader.startsWith(AUTHORIZATION_HEADER_PREFIX);
    }


    public static Claims parseJWT(String authToken) {
        return parseToken(authToken, "5aSp5pK45ZGA5LuW44CBd3Rm55qE5ZGA");
    }

    /**
     * 解析token
     *
     * @param authToken    授权头部信息
     * @param base64Secret base64加密密钥
     * @return
     */
    public static Claims parseToken(String authToken, String base64Secret) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(DatatypeConverter.parseBase64Binary(base64Secret))
                    .parseClaimsJws(authToken).getBody();
            return claims;
        } catch (SignatureException se) {
            // 这里自行抛出异常
            log.error("===== 密钥不匹配 =====", se);
            throw new CustomException(ResultCode.PERMISSION_NON_MATCHED);
        } catch (ExpiredJwtException ejw) {

            // 这里自行抛出异常
            log.error("===== token过期 =====", ejw);
            throw new CustomException(ResultCode.PERMISSION_TOKEN_EXPIRED);
        } catch (Exception e) {
            // 这里自行抛出异常
            log.error("===== token解析其他异常 =====", e);
            throw new CustomException(ResultCode.PERMISSION_TOKEN_INVALID);
        }
    }



    //------------------------------------------------------------------------------------
}